from django.db.models import Q
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import viewsets
from rest_framework.decorators import action

from BYD_ERP.utils.base_views import MultipleDestroyMixin, MultipleOpenMixin
from BYD_ERP.utils.pagination import GlobalPagination
from goods_info.models import UnitsModel
from goods_info.serializer.units_serializer import UnitsSerializer


class UnitsView(viewsets.ModelViewSet, MultipleDestroyMixin, MultipleOpenMixin):
    """
        create:
        计量单位信息--新增

        计量单位信息新增，status：201（成功），return：新增计量单位信息

        destroy:
        计量单位信息--删除

        计量单位信息删除，status：204（成功），return：None

        multiple_delete:
        计量单位信息--批量删除，必传参数：ids=[1,2,3,4……]

        计量单位信息批量删除，status：204（成功），return：None

        multiple_open:
        计量单位信息--批量启用或者禁用，必传（json）参数：ids=[1,2,3,4……]（列表中可以只有一个参数），is_open=1/0

        {
            "ids": [1,2],
            "is_open": "0"
        }
        is_open=1表示禁用，is_open=0表示启用
        计量单位信息批量启用或者禁用，status：204（成功），return：None

        update:
        计量单位信息--修改

        计量单位信息修改，status：200（成功），return：修改后的计量单位信息

        partial_update:
        计量单位信息--局部修改，可以传任意属性的值，服务器会修改指定的属性值

        计量单位信息局部修改，status：200（成功），return：修改后的计量单位信息

        list: 可以要也可以不要
        计量单位信息列表

        计量单位信息列表信息，status：200（成功），return：计量单位信息列表

        retrieve:
        查询某一个计量单位信息

        查询指定ID的计量单位信息，status：200（成功），return：指定计量单位信息

    """
    queryset = UnitsModel.objects.all()
    serializer_class = UnitsSerializer
    pagination_class = GlobalPagination

    def get_queryset(self):
        if self.action == 'find':  # 过滤查询
            # 获取请求参数（在get中）：pid
            # 如果是路径传参，需要使用request.query_params
            # 如果是json传参，需要使用request.data
            keyword = self.request.data.get('name', None)
            # 同时搜索基本单位名称，和副单位名称
            query = Q()
            if keyword:
                query.add(Q(basic_name__contains=keyword), 'OR')  # 多条件组合
                query.add(Q(backup_name__contains=keyword), 'OR')
            return UnitsModel.objects.filter(query).all()

        else:
            return UnitsModel.objects.all()

    json_params = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
        'name': openapi.Schema(type=openapi.TYPE_STRING, description="计量单位名字的关键字")
    })

    @swagger_auto_schema(method='post', request_body=json_params, operation_description="计量单位的过滤查询")
    # swagger_auto_schema中如果method='get'， 是不能用request_body=open_ids的
    # request_body就是定义json格式的传参
    @action(methods=['post'], detail=False)
    def find(self, request, *args, **kwargs):
        return super(UnitsView, self).list(request=request, *args, **kwargs)
